package com.itheima.wisdomnext.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.wisdomnext.entity.*;
import com.itheima.wisdomnext.entity.Result.ResponseResult;
import com.itheima.wisdomnext.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@CrossOrigin
@RestController
@RequestMapping("/api/post")
public class PostController {

    @Autowired
    private PostService postService; // 自动注入 PostService

    @PostMapping("/found")
    public ResponseResult<Post> createPost(
            @RequestPart("post") Post post,  // 使用 @RequestPart 接收 JSON 数据
            @RequestPart(value = "files", required = false) MultipartFile[] files, // 接收文件，可以为空
            @RequestPart(value = "options", required = false) String options // 接收问题选项（如果是问题帖子）
    ) {
        // 如果文件为空，设置为空数组（避免 NullPointerException）
        if (files == null) {
            files = new MultipartFile[0]; // 或者直接给文件数组赋予空数组
        }

        List<Object> optionsList = new ArrayList<>();  // 使用可变的空列表

        if (options != null) {
            try {
                // 使用 ObjectMapper 解析 JSON 字符串为 List<Object>
                ObjectMapper objectMapper = new ObjectMapper();
                optionsList = objectMapper.readValue(options, List.class);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 确保 optionsList 中有足够的元素
        String type = optionsList.size() > 0 ? (String) optionsList.get(0) : null;  // 默认为空字符串
        String title = optionsList.size() > 1 ? (String) optionsList.get(1) : null;  // 默认为空字符串
        // 确保 optionsList.get(2) 是一个 List，否则使用空列表
        List<String> nestedList = optionsList.size() > 2 && optionsList.get(2) instanceof List
                ? (List<String>) optionsList.get(2)
                : new ArrayList<>();  // 如果没有第三个元素，使用空列表
        // 转换为 String 数组
        String[] nestedArray = nestedList.toArray(new String[0]);

        // 调用 service 层方法处理文件并创建帖子
        Post createdPost = postService.createPost(post, files, type, title, nestedArray);

        return ResponseResult.success("创建成功", createdPost);
    }

    /**
     * 根据用户 ID 获取该用户的所有帖子（包括普通帖和问答帖）
     *
     * @param id 用户 ID
     * @return 帖子列表封装成 Postshow 的统一响应结果
     */
    @GetMapping("/{id}")
    public ResponseResult<List<Postshow>> getPostsByUserId(@PathVariable int id) {
        return postService.getPostById(id);
    }

    /**
     * 根据帖子 ID 获取单个帖子的详细信息（包括图片、作者、问答信息、点赞/收藏/关注状态等）
     *
     * @param pid 帖子 ID
     * @param id 当前登录用户 ID（可选，用于查询是否点赞、收藏、关注）
     * @return 单个 Postshow 对象的统一响应结果
     */
    @GetMapping("/checkline/{pid}")
    public ResponseResult<Postshow> getPostById(@PathVariable int pid,
                                                @RequestParam(value = "id", required = false) Long id) {
        return postService.getPostShowBypId(pid, id);
    }

    /**
     * 获取所有帖子的列表，根据用户权限进行过滤（可见性、点赞、收藏、关注等）
     *
     * @param id 当前登录用户的 ID（可选，用于判断帖子的可见性、是否点赞、收藏和关注等）
     * @return 包含所有符合条件的帖子信息的统一响应结果
     */
    @GetMapping("/All")
    public ResponseResult<List<Postshow>> getAllPosts(@RequestParam(value = "id", required = false) Long id) {
        // 调用 postService 获取当前用户可见的所有帖子，传入 id 判断用户（可以是 null）
        List<Postshow> postshows = postService.getVisiblePostsForUser(id);
        // 判断是否查询到帖子
        // 如果有帖子，返回成功的 ResponseResult，包含查询到的帖子列表
        return ResponseResult.success("查询成功", postshows);
    }

    /**
     * 获取当前用户关注的所有用户的帖子列表
     *
     * @param userId 当前用户的 ID
     * @return 包含关注用户的所有帖子的统一响应结果
     */
    @GetMapping("/followed/{userId}")
    public ResponseResult<List<Postshow>> getFollowedUsersPosts(@PathVariable int userId) {
        // 调用 postService 获取当前用户关注的所有人的帖子
        List<Postshow> postshows = postService.getFollowedUsersPosts(userId);

        // 如果查询到帖子，返回成功的 ResponseResult，包含帖子列表
        return ResponseResult.success("查询成功", postshows);
    }

    // 审核帖子
    @PutMapping("/audit")
    public ResponseResult<Object> auditPost(@RequestBody Post post) {
        postService.updatePostStatus(post);  // 更新帖子审核状态
        return ResponseResult.success("审核成功", null);
    }

    /**
     * 获取前10条话题或帖子（按时间排序）
     */
    @GetMapping("/recent")
    public ResponseResult<List<PostTopic>> getRecentPostsOrTopics() {
        // 调用服务层方法获取前10条话题或帖子
        List<PostTopic> postTopics = postService.getRecentPostsOrTopics();
        return ResponseResult.success("查询成功", postTopics);
    }

    @PutMapping("/{postId}")
    public ResponseResult updatePostVisibility(@PathVariable Long postId, @RequestParam String visibility) {
        return postService.updatePostVisibility(postId, visibility);
    }

    /**
     * 获取用户点赞的所有帖子
     *
     * @param userId 用户 ID
     * @return 用户点赞的帖子列表
     */
    @GetMapping("/liked/{userId}")
    public ResponseResult<List<Postshow>> getLikedPostsByUser(@PathVariable int userId) {
        List<Postshow> likedPosts = postService.getLikedPostsByUser(userId);
        return ResponseResult.success("查询成功", likedPosts);
    }

}
